/**
 * Copyright (c) 2017 ShopJsp. All Rights Reserved.
 * ============================================================================
 * 版权所有 2011 - 今 北京华宇盈通科技有限公司，并保留所有权利。
 * ----------------------------------------------------------------------------
 * 提示：在未取得SHOPJSP商业授权之前，您不能将本软件应用于商业用途，否则SHOPJSP将保留追究的权力。
 * ----------------------------------------------------------------------------
 * 官方网站：http://www.shopjsp.com
 * ============================================================================
 * @author 张丁方
 * @CreateTime 2017-3-29 15:21:46
 */
package com.hyyt.shopjsp.product.service;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import com.hyyt.shopjsp.product.pojo.*;
import com.hyyt.shopjsp.product.vo.ProductAttrListVo;
import com.hyyt.shopjsp.product.vo.ProductImageListVo;
import com.hyyt.shopjsp.product.vo.ParamGroupInfoVo;
import com.hyyt.shopjsp.product.vo.ParamGroupVo;
import com.hyyt.shopjsp.store.info.pojo.ShopShopInfo;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;

/**
* shop_productInfo, SHOP_商品
*
* @author Robot 2017-03-29 15:21:46
*/
public interface IShopProductInfoService{

    /**
     * 保存商品基础信息
     *
     * @param productInfo SHOP_商品
     * @return 更新后的SHOP_商品
     */
    void saveBasicShopProductInfo(ShopProductInfo productInfo);

    /**
     * 查询商品及关联信息
     *
     * @param productId 商品Id
     * @return 返回商品及关联信息集合
     */
    Map<String,Object> getShopProductAndRelationInfoByProductId(Integer productId);

    /**
     * 查询规格对象
     *
     * @param specificationId 规格Id
     * @return 返回商品规格对象
     */
    ShopSpecification getShopSpecificationBySpecificationId(Integer specificationId);

    /**
     * 查询规格对象
     *
     * @param specificationValueId 规格Id
     * @return 返回商品规格对象
     */
    ShopSpecificationValue getShopSpecificationValueBySpecificationValueId(Integer specificationValueId);

    /**
     * 查询商品和商品店铺内部分类信息
     *
     * @param productId 商品Id
     * @return 商品店铺内部分类对象
     */
    ShopShopProCategoryRelation getShopShopProCategoryRelationByProductId(Integer productId);

    /**
    * 更新SHOP_商品
    *
    * @param productInfo SHOP_商品
    * @return 更新后的SHOP_商品
    */
    void updateBasicShopProductInfo (ShopProductInfo productInfo);

    /**
    * 删除指定ID的SHOP_商品
    *
    * @param id SHOP_商品ID
    */
    void deleteShopProductInfo(Integer id);

    /**
    * 删除指定ID集合的SHOP_商品
    *
    * @param ids SHOP_商品ID集合
    */
    void deleteShopProductInfo(Collection<Integer> ids);

        /**
        * 根据ID加载一个SHOP_商品
        *
        * @param id SHOP_商品ID
        * @return SHOP_商品
        */
    ShopProductInfo loadShopProductInfo(Integer id);

    /**
    * 查询所有的SHOP_商品，通常有最多取30000条记录的限制
    *
    * @return 所有的SHOP_商品，通常有最多取30000条记录的限制
    */
    List<ShopProductInfo> queryAllShopProductInfo();

    /**
    * 查询SHOP_商品
    *
    * @param params 查询参数，为key-value形式
    * @return SHOP_商品集合
    */
    List<ShopProductInfo> queryShopProductInfo(Map<String, Object> params);

    /**
     * 查询SHOP_商品集合
     *
     * @param params   查询参数，没有则传null,分页参数key为“sortColumns”
     * @param startRow 起始行数（不含起始行的数据）
     * @param rowSize  要查询记录数
     * @return SHOP_商品集合
     */
    List<ShopProductInfo> queryProductList(Map<String, Object> params, int startRow, int rowSize);

    /**
    * 查询SHOP_商品
    *
    * @param params   查询参数，没有则传null,分页参数key为“sortColumns”
    * @param startRow 起始行数（不含起始行的数据）
    * @param rowSize  要查询记录数
    * @return SHOP_商品集合
    */
    List<Map<String,Object>>  queryShopProductInfo(Map<String, Object> params, int startRow, int rowSize);

    /**
    * 统计SHOP_商品
    *
    * @param params 查询参数，没有则传null,分页参数key为“sortColumns”
    * @return 结果集记录数
    */
    int countShopProductInfo(Map<String, Object> params);

    /**
     * 关联查询SHOP_商品
     * @param params
     * @param startRow
     * @param rowSize
     * @return
     */
	List<ShopProductInfo> queryListProductInfo(Map<String, Object> params, int startRow, int rowSize);

	/**
	 * 关联统计SHOP_商品
	 * @param params
	 * @return
	 */
	int countProductInfo(Map<String, Object> params);

    /**
     * 添加抢购时展示的商品列表
     * @param params
     * @param startRow
     * @param rowSize
     * @return
     */
	List<ShopProductInfo> queryProductInfoList(Map<String, Object> params, int startRow, int rowSize);

    /**
     * 添加抢购时展示的商品数量
     * @param params
     * @return
     */
	int queryProductInfoCount(Map<String, Object> params);

    /**
     * 微信语音识别结果搜索的商品列表，查询8条
     * @param params
     * @param startRow
     * @param rowSize
     * @return
     */
    List<ShopProductInfo> queryWxRecongnitionProductInfoList(Map<String, Object> params);

    /**
     * 产品列表查询商品
     *
     * @param params   查询参数，没有则传null,分页参数key为“sortColumns”
     * @param startRow 起始行数（不含起始行的数据）
     * @param rowSize  要查询记录数
     * @return SHOP_商品集合
     */
    List<ShopProductInfo> queryProductInfo(Map<String, Object> params, int startRow, int rowSize);

    /**
     * 添加商品
     *
     * @param shopProCategoryId  店铺商品内部分类
     * @param productImageListVo  商品图片虚拟对象
     * @param productInfo  商品对象
     * @param paramGroupInfoVo  商品参数组信息虚拟对象
     * @param paramGroupVo  商品参数组虚拟对象
     * @param productAttrListVo  商品属性虚拟对象
     * @param specifications  规格
     */
    void saveShopProductInfo(Integer shopProCategoryId,  ShopProductInfo productInfo, ProductImageListVo productImageListVo, ProductAttrListVo productAttrListVo, ParamGroupInfoVo paramGroupInfoVo, ParamGroupVo paramGroupVo, String specifications, String detailContent);

    /**
     * 更新商品信息
     *
     * @param shopProCategoryId  店铺商品内部分类
     * @param productInfo  商品对象
     * @param productImageListVo  商品图片虚拟对象
     * @param productAttrListVo  商品属性虚拟对象
     * @param paramGroupInfoVo  商品参数组信息虚拟对象
     * @param paramGroupVo  商品参数组虚拟对象
     * @param detailContent  商品详情信息
     */
    void updateShopProductInfo(Integer shopProCategoryId,  ShopProductInfo productInfo, ProductImageListVo productImageListVo, ProductAttrListVo productAttrListVo, ParamGroupInfoVo paramGroupInfoVo, ParamGroupVo paramGroupVo,String detailContent);


    /**
     * 获取商品的组Id
     * @return
     */
    int loadMaxGoods();

    /**
     * 详情页滚动图片上传
     *
     * @param productImageInfo 图片流文件
     * @param subSysFolderName 子系统目录
     * @param imageInfoPath 图片存放目录
     * @param productImg  商品组图图片对象
     */
    ShopProductImg uploadProductImage(MultipartFile productImageInfo, String subSysFolderName, String imageInfoPath, ShopProductImg productImg);

    /**
     * 删除商品组图信息
     *
     * @param productImageId 商品图片Id
     */
    void deleteProductImageByProductImageId(Integer productImageId);

    /**
     * 通过商品分类Id查询对应的商品属性及属性值信息
     *
     * @param productTypeId 商品分类Id
     * @return 返回商品属性集合
     */
    List<ShopProductAttribute> getProductAttributeAndValueList(Integer productTypeId);

    /**
     * 通过商品分类Id查询所有的商品规格参数及参数值信息
     *
     * @param productTypeId 商品分类Id
     * @return 返回商品规格参数集合
     */
    List<ShopProductParameter> getProductParameterAndValueList(Integer productTypeId);

    /**
     * 8、通过商品分类Id查询所有的商品规格组及值信息
     *
     * @param productTypeId 商品分类Id
     * @return 返回商品规格组集合
     */
    List<ShopSpecification> getProductSpecificationList(Integer productTypeId);


    /**
     * 9、通过商品分类Id查询所有的商品规格组及值信息
     *
     * @param specificationId 商品规格组Id
     * @return 返回商品规格组对应值集合
     */
    List<ShopSpecificationValue> getSpecificationValueListBySpecificationId(Integer specificationId);

    /**
     * 根据商品Id查询商品详情
     * @param productId
     * @return
     */
    Map<String,Object> getProductInfoById(Integer productId);

    /**
     * 10.商品审核操作
     * @param shopProductInfo
     * @param usersName
     * @return
     */
    boolean auditProduct(ShopProductInfo shopProductInfo,String usersName);

    /**
     * 11.修改商品返利操作
     * @param shopProductInfo
     * @return
     */
    boolean updateProductRatio(ShopProductInfo shopProductInfo);

    /**
     * 12.批量生成二维码操作
     * @param shopInfoProductType 店铺类型：1 自营，2 入驻
     * @param response
     */
    Map<String,Object> productInfoGeneratedQrCode(Integer shopInfoProductType,HttpServletResponse response);

    /**\
     * 删除商品及关联数据
     * @param productId
     * @return
     */
    boolean deleteProductAll(Integer productId);
}